package com.gitee.qdbp.general.system.api.personnel.service;

import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.base.system.model.IAccountType;
import com.gitee.qdbp.general.system.api.personnel.model.AccountBean;
import com.gitee.qdbp.general.system.api.personnel.model.UserCoreBean;

/**
 * 用户认证授权业务接口<br>
 * 这里是用户登录前的操作和用户自己的行为<br>
 * 而运营人员重置别人的密码/锁定/解锁别人的账号之类的操作都放在UserManagerExecutor中<br>
 *
 * @author zhaohuihua
 * @version 150915
 */
public interface IUserAuthExecutor {

    /**
     * 按ID登录(登录超时之后的重新登录)
     * 
     * @param id 账户ID
     * @param password 密码
     * @return 用户信息
     * @throws ServiceException
     */
    UserCoreBean login(String id, String password) throws ServiceException;

    /**
     * 用户登录<br>
     * > 根据登录账号的格式判断以哪种类型登录(工号/手机/邮箱)<br>
     * > 从sys_user_info表查询, 并验证是否存在<br>
     * > 判断密码是否匹配<br>
     * > 判断用户状态是否正常<br>
     *
     * @param account 登录账号
     * @param password 密码
     * @param choose 尝试以其他类型登录
     * @return 用户信息
     * @throws ServiceException
     */
    UserCoreBean login(AccountBean account, String password, IAccountType... choose) throws ServiceException;

    /**
     * 查询激活用户(可登录用户)<br>
     * > 根据登录账号的格式判断以哪种类型登录(工号/手机/邮箱)<br>
     * > 从sys_user_info表查询, 并验证是否存在<br>
     * > 判断用户状态是否正常<br>
     *
     * @param account 登录账号
     * @param choose 尝试以其他类型登录
     * @return 用户信息
     * @throws ServiceException
     */
    UserCoreBean findActivityUser(AccountBean account, IAccountType... choose) throws ServiceException;

    /**
     * 检查用户输入的密码是否正确
     * 
     * @param userId
     * @param password
     * @throws ServiceException
     */
    void checkPassword(String userId, String password) throws ServiceException;

    /**
     * 用户修改自己的密码
     * 
     * @param userId
     * @param oldPassword
     * @param newPassword
     * @throws ServiceException
     */
    void updatePassword(String userId, String oldPassword, String newPassword) throws ServiceException;

    /**
     * 修改他人的密码
     * 
     * @param model
     * @param newPassword
     * @throws ServiceException
     */
    void updatePassword(AccountBean model, String newPassword) throws ServiceException;

    /**
     * 发送登录短信/邮件验证码(以短信/邮件验证码方式登录)<br>
     * 只有先找到用户, 才能发短信, 因此发送完短信就确定了用户<br>
     * 此时将用户信息缓存在SESSION中<br>
     * 之后只需要在提交短信/邮件验证码时, 验证一下短信是否正确即可<br>
     * 没必要存在loginByValidCode()方法
     * 
     * @param model 账号
     * @param choose 备选的账号类型
     * @param 用户信息
     * @throws ServiceException
     */
    UserCoreBean sendLoginValidCode(AccountBean model, IAccountType... choose) throws ServiceException;

    /**
     * 检查登录短信/邮件验证码是否正确
     * 
     * @param model 账号
     * @param validCode 短信/邮件验证码
     * @param remove 验证之后是否删除
     * @return
     * @throws ServiceException
     */
    void checkLoginValidCode(AccountBean model, String validCode, boolean remove) throws ServiceException;

    /**
     * 发送注册短信/邮件验证码<br>
     * 如果手机号码已经注册过则提示错误<br>
     * 
     * @param model 账号
     * @throws ServiceException
     */
    void sendRegisterValidCode(AccountBean model) throws ServiceException;

    /**
     * 检查注册短信/邮件验证码是否正确
     * 
     * @param model 账号
     * @param validCode 短信/邮件验证码
     * @return
     * @throws ServiceException
     */
    void checkRegisterValidCode(AccountBean model, String validCode) throws ServiceException;

    /**
     * 手机号码注册
     * 
     * @param model 用户信息
     * @param validCode 短信/邮件验证码
     * @return
     * @throws ServiceException
     */
    UserCoreBean registerByValidCode(UserCoreBean model, String validCode) throws ServiceException;

    /**
     * 发送找回密码短信/邮件验证码<br>
     * 如果手机号码未注册过则提示错误<br>
     * 
     * @param model 账号
     * @param choose 备选的账号类型
     * @return
     * @throws ServiceException
     */
    UserCoreBean sendRepasswordValidCode(AccountBean model, IAccountType... choose) throws ServiceException;

    /**
     * 检查找回密码短信/邮件验证码是否正确
     * 
     * @param model 账号
     * @param validCode 短信/邮件验证码
     * @param remove 验证成功后是否删除
     * @return
     * @throws ServiceException
     */
    void checkRepasswordValidCode(AccountBean model, String validCode, boolean remove) throws ServiceException;

    /**
     * 以手机号码的找回密码
     * 
     * @param model 账号
     * @param validCode 短信/邮件验证码
     * @param newPassword
     * @throws ServiceException
     */
    void repasswordByValidCode(AccountBean model, String validCode, String newPassword) throws ServiceException;

    /**
     * 发送更换手机号码的短信/邮件验证码(发送给更换后的新手机号码)
     * 
     * @param userId 用户ID
     * @param newPhone 更换后的新手机号码
     * @throws ServiceException
     */
    void sendChangePhoneValidCode(String userId, String newPhone) throws ServiceException;

    /**
     * 检查更换手机号码的短信/邮件验证码是否正确
     * 
     * @param userId 用户ID
     * @param newPhone 更换后的新手机号码
     * @param validCode 短信/邮件验证码
     * @throws ServiceException
     */
    void checkChangePhoneValidCode(String userId, String newPhone, String validCode) throws ServiceException;

    /**
     * 更换手机号码
     * 
     * @param userId 用户ID
     * @param newPhone 更换后的新手机号码
     * @param validCode 短信/邮件验证码
     * @throws ServiceException
     */
    void changePhoneByValidCode(String userId, String newPhone, String validCode) throws ServiceException;
}
